package 字符串;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串的长度。
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 * @author 翟晓龙
 * @date 2022/4/19
 */
public class 无重复字符串的最长子串 {

    public static void main(String[] args) {

        int res = windowcal("abcabcbfedb");
        System.out.println("长度：" + res);

    }

    /**
     * 首先呢，就是获取原字符串的长度。
     * 接着维护一个窗口（数组、哈希、队列）
     * 窗口一步一步向右扩展
     * 窗口在向右扩展滑动过程，需要判断左边是否需要缩减
     * 最后比较更新答案
     */
    public static int windowcal(String str){

        Set<Character> windows = new HashSet<>(str.length());

        int length = str.length();
        int leftIndex = 0;
        int rightIndex = 0;
        int res = 0;

        while (rightIndex < length){
            Character c = str.charAt(rightIndex);
            // 窗口右移动
            rightIndex ++;

            while (windows.contains(c)){
                windows.remove(str.charAt(leftIndex));
                leftIndex ++;
            }
            windows.add(c);
            res = Math.max(windows.size(),res);
            System.out.println("window：" + Arrays.toString(windows.toArray()));
        }

        return res;
    }


}
